import fs from 'fs';
import pLimit from 'p-limit';
import path from 'path';
import sharp from 'sharp';
import { promisify } from 'util';
const rename = promisify(fs.rename);
const args = process.argv.slice(2);

// 限制同时处理的任务数为 5
const limit = pLimit(5);

// 尺寸判断阈值
const MIN_WIDTH = 750;
const MIN_HEIGHT = 1624;

// PNG 压缩选项
const PNG_COMPRESSION_LEVEL = 9; // 0-9，值越高压缩率越高，处理时间越长
const PNG_QUALITY = 80; // 质量范围0-100

/**
 * 递归查找目录中的所有图片文件
 * @param {string} dir - 起始目录
 * @returns {string[]} 图片文件路径列表
 */
function findImages(dir) {
	let results = [];
	const list = fs.readdirSync(dir);

	list.forEach(file => {
		const filePath = path.join(dir, file);
		const stat = fs.statSync(filePath);

		if (stat && stat.isDirectory()) {
			// 如果是目录，递归查找
			results = results.concat(findImages(filePath));
		} else if (/\.(png|jpe?g)$/i.test(file)) {
			// 如果是图片文件，添加到结果
			results.push(filePath);
		}
	});

	return results;
}

/**
 * 处理图片：裁剪空白、压缩，并覆盖原图
 * @param {string} filePath - 图片文件路径
 * @returns {Promise<void>} 处理完成的 Promise
 */
async function processImage(filePath) {
	const tempFilePath = `${filePath}.tmp`;
	try {
		const metadata = await sharp(filePath).metadata();

		if (metadata.width >= MIN_WIDTH && metadata.height >= MIN_HEIGHT) {
			// console.log(`图片尺寸符合条件，不处理，只压缩：${filePath}`);
			await sharp(filePath)
				.png({
					compressionLevel: PNG_COMPRESSION_LEVEL,
					quality: PNG_QUALITY,
				})
				.toFile(tempFilePath);
		} else {
			// console.log(`图片尺寸不符合条件，裁剪并压缩：${filePath}`);
			await sharp(filePath)
				.trim() // 裁剪空白像素
				.png({
					compressionLevel: PNG_COMPRESSION_LEVEL,
					quality: PNG_QUALITY,
				})
				.toFile(tempFilePath);
		}

		await rename(tempFilePath, filePath);

		console.log(`处理完成：${filePath}`);
	} catch (err) {
		console.error(`处理图片时出错：${filePath}`, err);
		if (fs.existsSync(tempFilePath)) fs.unlinkSync(tempFilePath); // 删除临时文件

	}
}

/**
 * 主函数：递归查找并处理目录中的所有图片（并发）
 * @param {string} rootDir - 起始目录
 */
async function processImagesInDirectory(rootDir) {
	const images = findImages(rootDir);

	console.log(`找到 ${images.length} 张图片，开始并发处理...`);

	const promises = images.map(imagePath => limit(() => processImage(imagePath))); // 使用并发限制
	await Promise.all(promises);
	console.log('所有图片处理完成。');
}


const targetDirectory =args[0]; // 替换为目标目录
console.log(targetDirectory);


processImagesInDirectory(targetDirectory);
